package user

import (
	"fmt"

	"gorm.io/gorm"
)

// 给用户添加积分，支持使用/不使用 事务模式，追加积分记录
// point 可以为负数
// tx 为事务对象
func AddPoint(tx *gorm.DB, UserId uint, point int, Note string) (err error) {
	// 若没有该用户，跳过
	var u User
	if err = tx.Where("`id`=?", UserId).Find(&u).Error; err != nil {
		return err
	}

	if u.ID == 0 {
		return nil
	}

	// 逐个修改用户积分
	if err = tx.Model(&User{}).
		Where("`id`=?", UserId).
		Update("`point`", gorm.Expr(fmt.Sprintf("`point` + %d", point))).Error; err != nil {

		return err
	}
	// 增加用户服务时长
	if err = tx.Model(&User{}).
		Where("`id`=?", UserId).
		Update("`serve_hour`", gorm.Expr(fmt.Sprintf("`serve_hour` + %d", point))).Error; err != nil {

		return err
	}

	// 逐个加入积分记录
	var rec UserPointRecord
	rec.Note = Note
	rec.Point = point
	rec.UserId = UserId
	if err = tx.Create(&rec).Error; err != nil {

		return err
	}

	return nil
}

// 扣除用户积分，时长不变
func ReducePoint(tx *gorm.DB, UserId uint, point int, Note string) (err error) {
	// 若没有该用户，跳过
	var u User
	if err = tx.Where("`id`=?", UserId).Find(&u).Error; err != nil {
		return err
	}

	if u.ID == 0 {
		return nil
	}

	// 逐个修改用户积分
	if err = tx.Model(&User{}).
		Where("`id`=?", UserId).
		Update("`point`", gorm.Expr(fmt.Sprintf("`point` - %d", point))).Error; err != nil {

		return err
	}

	// 逐个加入积分记录
	var rec UserPointRecord
	rec.Note = Note
	rec.Point = -point
	rec.UserId = UserId
	if err = tx.Create(&rec).Error; err != nil {

		return err
	}

	return nil
}
